package main

import (
	"admin-system/config"
	"admin-system/internal/controller"
	"admin-system/internal/middleware"
	"admin-system/internal/router"
	"admin-system/internal/service"
	"admin-system/pkg/database"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	"log"
	"log/slog"
	"os"
)

func init() {
	viper.SetConfigName("config") // 配置文件名称（不带扩展名）
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config") // 配置文件路径
	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("读取配置文件失败: %v", err)
	}
}

func main() {
	// 设置默认的文本日志处理器
	slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil)))
	slog.SetLogLoggerLevel(slog.LevelDebug)
	// 载入配置
	cfg, _ := config.InitConfig()
	// 初始化数据库连接
	db, err := database.NewDatabase(cfg)
	if err != nil {
		slog.Error("连接数据库失败：", "error", err)
		return
	}
	// 设置 Gin 模式
	if cfg.Server.Mode != "" {
		gin.SetMode(cfg.Server.Mode)
	} else {
		gin.SetMode(gin.ReleaseMode)
	}

	// 创建gin实例
	r := gin.Default()
	// 添加中间件
	r.Use(gin.Logger())
	r.Use(gin.Recovery())

	// 注入service
	svcContainer := service.NewService(db)
	// 注入Controller
	ctrl := controller.NewController(svcContainer)
	// 注入 中间价容器
	middle := middleware.NewMiddleware(svcContainer)
	// 初始化路由
	router.InitializeRoutes(r, ctrl, middle)

	// 启动服务器
	port := cfg.Server.Port
	if port == "" {
		port = "8080"
	}

	slog.Info("服务启动中...", "监听端口：", port)
	if err := r.Run(":" + port); err != nil {
		slog.Error("服务启动失败： ", err)
	}
}
